﻿# 1.准备工作
import numpy as np
import os
# %matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
import warnings
warnings.filterwarnings('ignore')
np.random.seed(42)

# 2.构造数据
X = 2*np.random.rand(100,1)
y = 4+3*X+np.random.randn(100,1)
# 展示数据
plt.plot(X,y,'b.')
plt.xlabel("x_1")
plt.ylabel("y")
plt.axis([0,2,0,15])
# plt.show()

# 增加一列，用于求解偏置项b
X_b = np.c_[(np.ones((100,1)), X)]
# print(X_b)
# 直接求解
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
# print(theta_best) # [[4.21509616], [2.77011339]]

# 画图（直接求解得到的回归方程）
X_new = np.array([[0],[2]])
# 增加一列，偏置项b（同求解时一样）
X_new_b = np.c_[(np.ones((2,1)), X_new)]
print(X_new_b)
# 预测结果
y_predict = X_new_b.dot(theta_best)
print(y_predict)
# 展示结果
plt.plot(X_new, y_predict, "r--")
plt.plot(X,y,'b.')
plt.axis([0,2,0,15])
plt.show()